package model

import (
	"common/global"
	"gorm.io/gorm"
	"time"
)

// User 用户表（扩展签到字段）
type User struct {
	gorm.Model
	Tel                string `gorm:"column:tel;type:char(11);comment:手机号;not null;" json:"tel"`
	Passwd             string `gorm:"column:passwd;type:varchar(120);comment:用户密码（哈希值）;not null;" json:"passwd"`
	Nickname           string `gorm:"column:nickname;type:varchar(60);comment:用户昵称;default:NULL;" json:"nickname"`
	Avatar             string `gorm:"column:avatar;type:varchar(256);comment:用户头像;default:NULL;" json:"avatar"`
	ContinuousSignDays int    `gorm:"column:continuous_sign_days;type:int;comment:连续签到天数;default:0;" json:"continuous_sign_days"`
	RetroactiveCards   int    `gorm:"column:retroactive_cards;type:int;comment:补签卡数量;default:0;" json:"retroactive_cards"`
	LastSignDate       string `gorm:"column:last_sign_date;type:date;comment:最近一次签到日期;default:NULL;" json:"last_sign_date"`
	RealName           string `gorm:"column:real_name;type:varchar(25);comment:真实姓名;" json:"real_name"`
	CardId             string `gorm:"column:card_id;type:varchar(20);comment:身份证号码;" json:"card_id"`
}

type SignRecord struct {
	Id            int32     `gorm:"column:id;type:int;primaryKey;not null;" json:"id"`
	UserId        int32     `gorm:"column:user_id;type:int;not null;" json:"user_id"`
	SignDate      time.Time `gorm:"column:sign_date;type:date;comment:签到日期;not null;" json:"sign_date"`                               // 签到日期
	Type          int8      `gorm:"column:type;type:tinyint;comment:类型（1正常签到 2补签）;not null;" json:"type"`                             // 类型（1正常签到 2补签）
	IsRetroactive int8      `gorm:"column:is_retroactive;type:tinyint;comment:是否补签（0否 1是）;not null;default:0;" json:"is_retroactive"` // 是否补签
	CreatedAt     time.Time `gorm:"column:created_at;type:datetime;not null;default:CURRENT_TIMESTAMP;" json:"created_at"`
}

func (s *SignRecord) TableName() string {
	return "sign_records"
}

func (u *User) TableName() string {
	return "user"
}

// UpdateSignInfo 更新签到信息（事务安全）
func (u *User) UpdateSignInfo(continuousDays int, lastSignDate string) error {
	return global.Db.Model(u).Updates(map[string]interface{}{
		"continuous_sign_days": continuousDays,
		"last_sign_date":       lastSignDate,
	}).Error
}

func (u *User) FindUserByTel(tel string) (*User, error) {
	var user User
	if err := global.Db.Where("tel =?", tel).First(&user).Error; err != nil {
		return nil, err
	}
	return &user, nil
}

// DeductRetroactiveCard 扣除补签卡（事务安全）
func (u *User) DeductRetroactiveCard() error {
	return global.Db.Model(u).Update("retroactive_cards", gorm.Expr("retroactive_cards - ?", 1)).Error
}

// CheckTelExist 检查手机号是否存在
func CheckTelExist(tx *gorm.DB, tel string) bool {
	var count int64
	tx.Model(&User{}).Where("tel = ?", tel).Count(&count)
	return count > 0
}
func (u *User) QueryUserRealNameCardId(cardId string) (bool, error) {
	var count int64
	err := global.Db.Model(&User{}).Where("card_id = ?", cardId).Count(&count).Error
	if err != nil {
		return false, err
	}
	return count > 0, nil
}
func (u *User) GetUserAccountInfoByUid(uid int64) (result *User, err error) {
	err = global.Db.Model(&User{}).Where("id = ?", uid).Limit(1).Find(&result).Error
	return
}
